﻿#ifndef _JGAI_CGF_H__
#define _JGAI_CGF_H__
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 JCFG_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样，源文件中包含此文件的任何其他项目都会将
// JCFG_API 函数视为是从 DLL 导入的，而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef JCFG_EXPORTS
#define JCFG_API __declspec(dllexport)
#else
#define JCFG_API __declspec(dllimport)
#endif

#include <vector> // vector
#include <string> // stringW
#include "tchar.h"

// 此类是从 dll 导出的
class JCFG_API CJgConfig {
public:
	CJgConfig(void);
	~CJgConfig(void);

	

	// TODO: 在此处添加方法。
	void setFilename(LPCWSTR fn);
	LPCWSTR getFilename();



	bool loadCfg();
	bool setDefaultJson(const std::string&  jsonStr);
	bool saveCfg();

	//void setInt(const std::string& key, int v);
	//void setBool(const std::string& key, bool v);
	//void setDouble(const std::string& key, double v);
	//void setString(const std::string& key, const std::string& v);
	//void setVectorInt(const std::string& key, const std::vector<int>& v);
	//void setVectorBool(const std::string& key, const std::vector<bool>& v);
	//void setVectorDouble(const std::string& key, const std::vector<double>& v);
	//void setVectorString(const std::string& key, const std::vector<std::string>& v);

	// 注，key支持的长度最大为5. 即最多嵌套5层JSON对象
	void setInt(const std::vector<std::string>& key, int v);
	void setBool(const std::vector<std::string>& key, bool v);
	void setDouble(const std::vector<std::string>& key, double v);
	void setString(const std::vector<std::string>& key, const std::string& v);
	void setVectorInt(const std::vector<std::string>& key, const std::vector<int>& v);
	void setVectorBool(const std::vector<std::string>& key, const std::vector<bool>& v);
	void setVectorDouble(const std::vector<std::string>& key, const std::vector<double>& v);
	void setVectorString(const std::vector<std::string>& key, const std::vector<std::string>& v);



	//int    getInt(const std::string& key, int vDef = 0);
	//bool   getBool(const std::string& key, bool vDef = false);
	//double getDouble(const std::string& key, double vDef = 0.0);
	//std::string         getString(const std::string& key, const std::string& vDef = "");
	//std::vector<int>    getVectorInt(const std::string& key, const std::vector<int>& vDef = {});
	//std::vector<bool>   getVectorBool(const std::string& key, const std::vector<bool>& vDef = {});
	//std::vector<double> getVectorDouble(const std::string& key, const std::vector<double>& vDef = {});
	//std::vector<std::string> getVectorString(const std::string& key, const std::vector<std::string>& vDef = {});

	//
	int    getInt(const std::vector<std::string>& key, int vDef=0);
	bool   getBool(const std::vector<std::string>& key, bool vDef=false);
	double getDouble(const std::vector<std::string>& key, double vDef=0.0);
	std::string         getString(const std::vector<std::string>& key, const std::string& vDef="");
	std::vector<int>    getVectorInt(const std::vector<std::string>& key, const std::vector<int>& vDef= {});
	std::vector<bool>   getVectorBool(const std::vector<std::string>& key, const std::vector<bool>& vDef= {});
	std::vector<double> getVectorDouble(const std::vector<std::string>& key, const std::vector<double>& vDef= {});
	std::vector<std::string> getVectorString(const std::vector<std::string>& key, const std::vector<std::string>& vDef= {});
	
};

extern JCFG_API int nJCfg;
JCFG_API std::string  Version(void);

#endif